"""
https://leetcode.cn/problems/swap-nodes-in-pairs/description/

24. 两两交换链表中的节点
已解答
中等
相关标签
相关企业
给你一个链表，两两交换其中相邻的节点，并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题（即，只能进行节点交换）。

 

示例 1：


输入：head = [1,2,3,4]
输出：[2,1,4,3]
示例 2：

输入：head = []
输出：[]
示例 3：

输入：head = [1]
输出：[1]
 

提示：

链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100

"""

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

from typing import Optional


class Solution:
    """
    此题如果使用双向节点，比较容易解决
    在没有双向节点设计的情况下，可以另外创建一个数组记录其顺序
    特殊的，对最后一个奇数索引的节点不做处理
    1-2-3-4-5-6-7
    2-1-4-3-6-5-7

    此题单纯用算法考虑比较复杂，不如直接利用python的list特性

    """
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head==None:
            return None
        
        node_list=[head]
        temp=head
        while temp.next!=None:
            temp=temp.next
            node_list.append(temp)

        for i in range(len(node_list)//2):
            i1=i*2
            i2=i*2+1
            node_list[i1],node_list[i2]=node_list[i2],node_list[i1]

        for i in range(len(node_list)):
            node_list[i].next=node_list[i+1] if i+1<len(node_list) else None

        return node_list[0]

if __name__=='__main__':
    # finished
    pass